package com.libinyn.base.service.common;


import org.apache.ibatis.annotations.Param;

import java.util.List;


/**
 * 通用的数据库操作接口
 * @fileName: ICommonService.java
 * @author: bin.li01
 * @date: 2017/10/18 21:15
 * @version: v1.0.0
 */
public interface ICommonService<T> {


    /**
     * 说明：根据实体中的属性值进行查询，查询条件使用等号
     * @param record 实体
     * @return List<T>
     * @throws Exception 抛出异常
     */
    List<T> select(T record) throws Exception;

    /**
     * 说明：根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
     * @param key 主键
     * @return T
     * @throws Exception 抛出异常
     */
    T selectByPrimaryKey(Object key) throws Exception;

    /**
     * 说明：查询全部结果，select(null)方法能达到同样的效果
     * @return List<T>
     * @throws Exception 抛出异常
     */
    List<T> selectAll() throws Exception;


    /**
     * 说明：根据实体中的属性进行查询，只能有一个返回值，有多个结果是抛出异常，查询条件使用等号
     * @param record 实体
     * @return T
     * @throws Exception 抛出异常
     */
    T selectOne(T record) throws Exception;


    /**
     * 说明：根据实体中的属性查询总数，查询条件使用等号
     * @param record 实体
     * @return count
     * @throws Exception 抛出异常
     */
    int selectCount(T record) throws Exception;


    /**
     * 说明：保存一个实体，null的属性也会保存，不会使用数据库默认值
     * @param record
     * @return row
     * @throws Exception 抛出异常
     */
    int insert(T record) throws Exception;

    /**
     * 说明：保存一个实体，null的属性不会保存，会使用数据库默认值
     * @param record 实体
     * @return row
     * @throws Exception 抛出异常
     */
    int insertSelective(T record) throws Exception;

    /**
     * 说明：根据主键更新实体全部字段，null值会被更新
     * @param record 实体
     * @return row
     * @throws Exception 抛出异常
     */
    int updateByPrimaryKey(T record) throws Exception;

    /**
     * 说明：根据主键更新属性不为null的值
     * @param record 实体
     * @return row
     * @throws Exception 抛出异常
     */
    int updateByPrimaryKeySelective(T record) throws Exception;

    /**
     * 说明：根据实体属性作为条件进行删除，查询条件使用等号
     * @param record 实体
     * @return row
     * @throws Exception 抛出异常
     */
    int delete(T record) throws Exception;

    /**
     *说明：根据主键字段进行删除，方法参数必须包含完整的主键属性
     * @param key 主键
     * @return row
     * @throws Exception 抛出异常
     */
    int deleteByPrimaryKey(Object key) throws Exception;


    /**
     * 说明：根据Condition条件进行查询
     * @param condition
     * @return List<T>
     * @throws Exception 抛出异常
     */
    List<T> selectByCondition(Object condition) throws Exception;

    /**
     * 说明：根据Condition条件进行查询总数
     * @param condition
     * @return count
     * @throws Exception 抛出异常
     */
    int selectCountByCondition(Object condition) throws Exception;


    /**
     * 说明：根据Condition条件更新实体record包含的全部属性，null值会被更新
     * @param record 实体
     * @param condition 条件
     * @return row
     * @throws Exception 抛出异常
     */
    int updateByCondition(@Param("record") T record, @Param("example") Object condition) throws Exception;


    /**
     *  说明：根据Condition条件更新实体record包含的不是null的属性值
     * @param record
     * @param condition
     * @return row
     * @throws Exception 抛出异常
     */
    int updateByConditionSelective(@Param("record") T record, @Param("example") Object condition) throws Exception;


    /**
     * 说明：根据Condition条件删除数据
     * @param condition 条件
     * @return row
     * @throws Exception 抛出异常
     */
    int deleteByCondition(Object condition) throws Exception;


    /**
     * 说明：批量插入，支持批量插入的数据库可以使用，例如MySQL,H2等，另外该接口限制实体包含id属性并且必须为自增列
     * @param recordList 实体列表
     * @return row
     * @throws Exception 抛出异常
     */
    int insertList(List<T> recordList) throws Exception;


    /**
     *  说明：根据主键字符串进行查询，类中只有存在一个带有@Id注解的字段;
     * @param ids ids 如 "1,2,3" 这种形式的字符串,主键
     * @return List<T>
     * @throws Exception 抛出异常
     */
    List<T> selectByIds(String ids) throws Exception;


    /**
     * 说明：根据主键字符串进行删除，类中只有存在一个带有@Id注解的字段
     * @param ids ids 如 "1,2,3" 这种形式的字符串,主键
     * @return row
     * @throws Exception 抛出异常
     */
    int deleteByIds(String ids) throws Exception;


}
